package com.cskaoyan.javase.homework.day04._03array.merge;

import java.util.Arrays;

/**
 * 合并数组,思路是：
 *      首先获取两个数组的长度得出新数组的长度
 *
 * 上面的Demo已经能够实现功能了,但还有一些小细节可以优化
 * Demo2就来看一下优化
 *
 * @since 16:21
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class MergeArrDemo2 {
    public static void main(String[] args) {
        int[] arr1 = {1, 2, 3, 6, 7, 8};
        int[] arr2 = {4, 5, 6};
        int[] newArr = mergeTwoIntArr(arr1, arr2);
        System.out.println(Arrays.toString(newArr));
    }

    /**
     * 合并两个int数组,得到一个新数组
     * @since 16:33
     * @param arr1 需要合并的数组1
     * @param arr2 需要合并的数组2
     * @return int[]
     * @author wuguidong@cskaoyan.onaliyun.com
     */
    public static int[] mergeTwoIntArr(int[] arr1, int[] arr2) {
        int mergeLength = arr1.length + arr2.length;
        int[] result = new int[mergeLength];

        // 开始赋值arr1
        copyIntArr(arr1, result, 0);

        // 开始赋值arr2
        copyIntArr(arr2, result, arr1.length);

        return result;
    }

    /*
        上面这个方法在给新数组赋值时,很明显用了两个for循环,这个代码是可以提取出方法的
        那么在Demo2我们就提取出方法,来优化代码

        在实际开发中,这种场景是非常多,我们写方法,追求:
            突出代码逻辑中的主干
            而那些分支逻辑,最好提取出来作为额外的方法,这样能够使主干逻辑更加清晰
     */

    /**
     * 拷贝数组,将源数组的元素全部拷贝到目标数组中,可以选择从目标数组的什么位置开始复制
     * @since 16:57
     * @param srcArr 源数组,被拷贝的数组
     * @param dstArr 目标数组,将源数组元素拷贝到的数组
     * @param dstBegin 拷贝进目标数组的开始下标(包含)
     * @author wuguidong@cskaoyan.onaliyun.com
     */
    public static void copyIntArr(int[] srcArr, int[] dstArr, int dstBegin) {
        // 拷贝结束的下标(不包含)
        int dstEnd = dstBegin + srcArr.length;
        // 遍历目标数组的对应区间,进行元素拷贝
        int srcIndex = 0;
        for (int i = dstBegin; i < dstEnd; i++) {
            dstArr[i] = srcArr[srcIndex];
            srcIndex++;
        }
    }


}
